package net.linku.repository;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import net.linku.domain.LARole;
import net.linku.enums.StatusEnum;
import net.linku.mapper.LARoleMapper;
import net.linku.model.req.menu.AdminRoleQuery;
import net.linku.model.req.role.AdminRoleReqQuery;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * LARoleRepository 继承了 MyBatis-Plus 的 ServiceImpl 类，
 * 提供了对 LARole 实体的数据库操作。
 * <p>
 * 该类主要用于实现根据查询条件获取用户角色代码的方法。
 */
@Repository
public class LARoleRepository extends ServiceImpl<LARoleMapper, LARole> {

    /**
     * 根据查询条件获取用户角色代码。
     *
     * @param adminRoleQuery 包含查询条件的 AdminRoleQuery 对象。
     * @return 用户角色代码。
     */
    public String getUserRoleCode(AdminRoleQuery adminRoleQuery) {
        return this.baseMapper.getUserRoleCode(adminRoleQuery);
    }

    /**
     * 根据查询条件获取用户角色列表。
     *
     * @param adminRoleQuery 包含查询条件的 AdminRoleQuery 对象。
     * @return 符合条件的角色列表。
     */
    public List<LARole> queryRolesByCondition(AdminRoleQuery adminRoleQuery) {
        // 创建查询条件包装器
        LambdaQueryWrapper<LARole> queryWrapper = new LambdaQueryWrapper<>();

        // 根据角色ID列表筛选角色
        if (adminRoleQuery.getRoleIds() != null && !adminRoleQuery.getRoleIds().isEmpty()) {
            queryWrapper.in(LARole::getId, adminRoleQuery.getRoleIds());
        }

        // 根据租户ID筛选角色
        if (adminRoleQuery.getTenantId() != null) {
            queryWrapper.eq(LARole::getTenantId, adminRoleQuery.getTenantId());
        }

        // 根据角色名称筛选角色
        if (adminRoleQuery.getRoleName() != null) {
            queryWrapper.like(LARole::getName, adminRoleQuery.getRoleName());
        }

        // 根据角色代码筛选角色
        if (adminRoleQuery.getRoleCode() != null) {
            queryWrapper.eq(LARole::getCode, adminRoleQuery.getRoleCode());
        }

        // 根据父主键筛选角色
        if (adminRoleQuery.getParentId() != null) {
            queryWrapper.eq(LARole::getParentId, adminRoleQuery.getParentId());
        }

        // 筛选未删除的角色
        queryWrapper.eq(LARole::getDeletedFlag, StatusEnum.NORMAL.getDeletedFlag());

        // 执行查询并返回结果
        return this.list(queryWrapper);
    }

    /**
     * 分页查询角色信息
     *
     * @param query 角色查询参数
     * @return 分页后的角色信息
     */
    public Page<LARole> pageRoles(AdminRoleReqQuery query) {
        // 获取查询条件
        LambdaQueryWrapper<LARole> lambdaQueryWrapper = bindQueryWrapper(query);

        // 创建分页对象
        Page<LARole> page = new Page<>(query.getCurrent(), query.getSize());

        // 根据查询条件进行分页查询
        Page<LARole> laRolePage = this.baseMapper.selectPage(page, lambdaQueryWrapper);

        // 获取查询结果记录
        List<LARole> records = laRolePage.getRecords();

        // 构建返回的分页对象
        Page<LARole> resultPage = new Page<>(query.getCurrent(), query.getSize(), laRolePage.getTotal());
        resultPage.setRecords(records);

        return resultPage;
    }

    /**
     * 构建查询条件
     *
     * @param query 角色查询参数
     * @return 查询包装器
     */
    private LambdaQueryWrapper<LARole> bindQueryWrapper(AdminRoleReqQuery query) {
        LambdaQueryWrapper<LARole> lambdaQueryWrapper = new LambdaQueryWrapper<>();

        // 获取查询条件，并将其绑定到查询包装器中
        if (query.getId() != null) {
            lambdaQueryWrapper.eq(LARole::getId, query.getId());
        }
        if (query.getTenantId() != null) {
            lambdaQueryWrapper.eq(LARole::getTenantId, query.getTenantId());
        }
        if (query.getRoleName() != null) {
            lambdaQueryWrapper.like(LARole::getName, query.getRoleName());
        }
        if (query.getRoleCode() != null) {
            lambdaQueryWrapper.like(LARole::getCode, query.getRoleCode());
        }
        if (query.getDescription() != null) {
            lambdaQueryWrapper.like(LARole::getDescription, query.getDescription());
        }
        if (query.getRoleAlias() != null) {
            lambdaQueryWrapper.like(LARole::getRoleAlias, query.getRoleAlias());
        }
        if (query.getEnabledFlag() != null) {
            lambdaQueryWrapper.eq(LARole::getEnabledFlag, query.getEnabledFlag());
        }
        if (query.getParentId() != null) {
            lambdaQueryWrapper.eq(LARole::getParentId, query.getParentId());
        }
        if (query.getRoleIds() != null && !query.getRoleIds().isEmpty()) {
            lambdaQueryWrapper.in(LARole::getId, query.getRoleIds());
        }

        // 添加条件，筛选未删除的角色
        lambdaQueryWrapper.eq(LARole::getDeletedFlag, StatusEnum.NORMAL.getDeletedFlag());
        // 根据更新时间排序
        lambdaQueryWrapper.orderByDesc(LARole::getLastUpdateDate);

        return lambdaQueryWrapper;
    }

}
